<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<script>
/*    <h2>什么是闭包</h2>
    <p>闭包，官方对闭包的解释是：一个拥有许多变量和绑定了这些变量的环境的表达式（通常是一个函数），因而这些变量也是该表达式的一部分。闭包的特点：</p>
    <p>1. 作为一个函数变量的一个引用，当函数返回时，其处于激活状态。</p>
    <p>2. 一个闭包就是当一个函数返回时，一个没有释放资源的栈区。</p>
    <p>简单的说，Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且，这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时，就会形成闭包。</p>*/
    function log(){
        var args = Array.prototype.slice.call(arguments);
        console.log.apply(console,args)
    }
    //要想用this的写法必须先实例化后使用
    //闭包的5种写法
    function Circle(r){
        this.r = r;
    }
    Circle.PI = 3.14;
    Circle.prototype.area = function(){
        return Circle.PI * this.r * this.r;
    };
    var c = new Circle(3);
    log(c.area());

    function Circle2(){
        var obj = new Object();
        obj.PI = 3.14;
        obj.area = function(r){
            return this.PI * r * r;
        }
        return obj;
    }
    var c2 = new Circle2();//实例化之后才能调用
    log(c2.area(10))

    var Circle3 = new Object();
    Circle3.PI = 3.14;
    Circle3.area = function(r){
        return this.PI * r * r;
    }
    log(Circle3.area(4));

    var Circle4 = {
        PI:3.14,
        area:function(r){
            return this.PI *r * r
        }
    }

    log(Circle4.area(7));

    var Circle5 = new Function("this.PI = 3.14;this.area = function(r){return this.PI * r * r}");
    var c5 = new Circle5();
    log(c5.area(6));

    //prototype的使用方法
    /*1、不使用prototype属性定义的对象方法，是静态方法，只能直接用类名进行调用！另外，此静态方法中无法使用this变量来调用对象其他的属性！
    2、使用prototype属性定义的对象方法，是非静态方法，只有在实例化后才能使用！其方法内部可以this来引用对象自身中的其他属性！*/
    var dom = function (){

    };
    dom.Show = function(){
        log("show")
    };
    dom.prototype.Display = function () {
        log("display")
    };
    dom.Show();
//    dom.Display(); error
    var d = new dom();
//    d.Show(); error
    d.Display();

    var html = new Object();
    html.Name = 'Object';
    html.Success = function(){
        this.Say = function(){
            alert("Hello,world");
        };
        alert("Obj Success");
    };
    html.Success.prototype.show = function(){
        alert("dasds")
    }
//    html.Success();
    var e = new html.Success();
    e.Say();
    e.show();
</script>
</body>
</html>